/*
 *
 *  Copyright (C) 2012-2024
 *  All rights reserved, Designed By 杭州连线客信息技术有限公司
 *  注意：
 *  本软件为杭州连线客信息技术有限公司开发研制，未经购买不得使用
 *  购买后可获得全部源代码（禁止转卖、分享、上传到码云、github等开源平台）
 *  一经发现盗用、分享等行为，将追究法律责任，后果自负
 *
 */

package com.lxk.oms.order.domain.req;

import cn.hutool.core.collection.CollUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.lxk.event.oms.enums.OrderEnums;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 创建订单参数
 *
 * @author heyi
 * 2024/8/20
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class CreateOrderReq extends BaseReq {

    /**
     * 租户ID
     */
    @JsonIgnore
    @Parameter(hidden = true)
    private String tenantId;


    /**
     * 订单名称
     * 订单名字最大为200，超过后截取前200
     */
    private String orderName;

    /**
     * 用户ID
     */
    @JsonIgnore
    @Parameter(hidden = true)
    private Long userId;

    /**
     * 是否保存入库
     */
    @JsonIgnore
    @Parameter(hidden = true)
    private Boolean saveDb = true;

    /**
     * 用户备注
     */
    private String userRemark;

    /**
     * 商户ID
     */
    private Long merId;

    /**
     * 订单类型
     */
    private OrderEnums.OrderType orderType;


    /**
     * 是否需要库存，默认是需要库存
     */
    @JsonIgnore
    @Parameter(hidden = true)
    private Boolean needStock = true;


    /**
     * 下单类型
     */
    private CreateType createType = CreateType.NORMAL;

    /**
     * 用户地址ID
     */
    private Long userAddressId;

    /**
     * 快递
     */
    private OrderEnums.DeliveryType deliveryType = OrderEnums.DeliveryType.KD;


    /**
     * 下单商品信息
     */
    @NotNull
    private List<CreateOrderItem> createOrderItemList;

    /**
     * 虚拟下单商品信息
     */
    private List<CreateVirtualOrderItem> virtualOrderItems;


    /**
     * 购物车ID  仅在购物车下单有效
     */
    private List<Long> cartIdList;


    @AllArgsConstructor
    @Getter
    public enum CreateType {
        NORMAL(0, "正常下单"),
        CART(1, "购物车下单"),

        ;

        private static final Map<Integer, CreateType> map = CollUtil.toList(CreateType.values()).stream().collect(Collectors.toMap(CreateType::getCode, v -> v));
        private final Integer code;
        private final String name;

        public static Boolean containCode(Integer code) {
            return map.containsKey(code);
        }

        public static CreateType getByCode(Integer code) {
            return map.get(code);
        }
    }

    @Data
    public static class CreateOrderItem {

        /**
         * 商家ID 不再使用，以com.lxk.oms.order.domain.req.CreateOrderReq#merId为准
         */
        @Deprecated
        private Long merId = 0L;
        /**
         * 规格ID
         */
        @NotNull
        private Long skuId;

        /**
         * 商品ID  无效参数
         */
        @Deprecated
        private Long spuId;

        /**
         * 购买数量
         */
        @NotNull
        private Integer count;

        /**
         * 金额
         */
        private BigDecimal amount;


        /**
         * SKU名称
         */
        private String skuName;


    }


    @Data
    public static class CreateVirtualOrderItem {


        /**
         * 购买数量
         */
        @NotNull
        private Integer count;
        /**
         * 金额
         */
        @NotNull
        private BigDecimal amount;


        /**
         * SKU名称
         */
        private String skuName;

        /**
         * 虚拟spuId 可能是优惠券，券包，活动报名
         */
        private Long virtualSpuId = 0L;

        /**
         * 虚拟skuId 可能是优惠券，券包，活动报名
         */
        private Long virtualSkuId = 0L;


    }
}
